import empty from "./empty";

/**
 * 时间格式化
 * @param date { string | number | Date }
 * @param fmt { string | boolean } 当取 boolean=true 时带上时分秒
 */
const formatDate = (date, fmt = 'yyyy-MM-dd') => {
  if(empty(date)) {
    return '';
  }

  let innerDate

  // 处理 字符串类型的 date
  const rs = /^(\d{4})-(\d{2})-(\d{2})(\s(\d{2}):(\d{2}):(\d{2}))?$/.exec(date);
  
  // 兼容部分设备不支持 new Date(string)
  if(rs === null) {
    innerDate = new Date(isNaN(date) ? date : +date);
  } else {
    innerDate = new Date(+rs[1], +rs[2] - 1, +rs[3], +rs[5] || 0, +rs[6] || 0, +rs[7] || 0)
  }

  // 无效时间
  if(['Invalid Date'].includes(innerDate.toString())) {
    return date
  }

  const config = {
    'M+' : innerDate.getMonth() + 1, // 月份
    'd+' : innerDate.getDate(), // 日
    'h+' : innerDate.getHours(), // 小时
    'm+' : innerDate.getMinutes(), // 分
    's+' : innerDate.getSeconds(), // 秒
    'q+' : Math.floor((innerDate.getMonth() + 3) / 3), // 季度
    'S' : innerDate.getMilliseconds() // 毫秒
  }

  fmt = [true].includes(fmt) ? 'yyyy-MM-dd hh:mm:ss' : fmt

  fmt = fmt.replace(/(y+)/ , v => {
    return String(innerDate.getFullYear()).substr(4 - v.length);
  })

  for(const key in config) {
    fmt = fmt.replace(new RegExp('(' + key + ')'), v => {
      if(v.length === 1) {
        return config[key];
      }
      return ('00' + config[key]).substr((''+ config[key]).length);
    })
  }

  return fmt
}

export default formatDate;